#include <stdio.h>

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
};

int max(int a, int b) {
    if(a > b) return a;
    return b;
}

int res = 0;

// 前序遍历
// 每次调用递归函数的时候，都是处理二叉树的某个节点
// 二叉树的节点除了存储节点值之外，还可以存储其他属性值，比如这个节点的深度
// 这个节点所有的信息，都是以函数参数的方式，存储在对应的栈帧中
void preOrder(struct TreeNode *root, int depth) {
    // 最小子问题
    if (root == NULL) return;
    res = max(res, depth);
    // 遍历左子树
    preOrder(root->left, depth + 1);
    // 遍历右子树
    preOrder(root->right, depth + 1);
}

// 后序遍历
// 计算以 node 为根节点的二叉树的最大深度
// 后序遍历
int postOrder(struct TreeNode *root) {
    // 最小子问题
    if (root == NULL) return 0;
    // 遍历左子树
    int leftMaxDepth = postOrder(root->left);
    // 遍历右子树
    int rightMaxDepth = postOrder(root->right);

    return max(leftMaxDepth, rightMaxDepth) + 1;
}

int maxDepth(struct TreeNode *root) {
    // 最小子问题
    if (root == NULL) return 0;
    // 遍历左子树
    int leftMaxDepth = maxDepth(root->left);
    // 遍历右子树
    int rightMaxDepth = maxDepth(root->right);

    return max(leftMaxDepth, rightMaxDepth) + 1;
}

int main(void) {
    struct TreeNode node5 = {7, NULL, NULL};
    struct TreeNode node4 = {11, NULL, NULL};
    struct TreeNode node3 = {23, NULL, NULL};
    struct TreeNode node2 = {9, NULL, &node5};
    struct TreeNode node1 = {8, &node3, &node4};
    struct TreeNode root = {10, &node1, &node2};

    printf("%d", maxDepth(&root));

    return 0;
}
